前面介绍了对ContentProvider的访问,包括增、删、改、查。那么当ContentProvider内容发生改变时,我们也希望应用程序能够做出相应。换句话说,应用程序“监视”着ContentProvider,一旦其内容发生改变(这种改变可能来自ContentProvider自身,也可能来自第三方应用程序),应用程序能够做出反应。

7.4.3.1 ContentObserver 简介

Android系统提供ContentObserver来实现监听功能。实现监听功能包括以下几个步骤:

1、注册。通知Android系统应用程序对于某个Uri感兴趣,如果该Uri对应的ContenProvider数据发生改变,Android系统会自动调用ContentObserver的onChange方法,这非常类似于数据库中触发器。

public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)

其中uri为需要监听的ContentProvider所对应的Uri。

notifyForDescendents为false时表示精确匹配,为true时表示同时匹配派生的Uri。例如对于Uri内容为“content:\/\/com.sample”来说,当notifyForDescendents为false时仅有“content:\/\/com.sample”同该Uri匹配,但是当notifyForDescendents为true时,则“content:\/\/com.sample”、“content:\/\/com.sample\/path”、“content:\/\/com.sample\/path\/child_path”等均匹配。

2、重写ContentObserver的onChange方法,在此方法读取改变的内容,然后再做进一步地处理。

7.4.3.2 ContentObserver示例

public class MainActivity extends AppCompatActivity {
    private final static String TAG="myTag";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);     
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
            }
        });
        getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI,true,
              new ContactsObserver(new Handler()));
     }

     private final class ContactsObserver extends ContentObserver{
         public ContactsObserver(Handler handler){super(handler); 
     }

     @Override
     public void onChange(boolean selfChange) { 
         Log.v(TAG,"Contact data is changed."); 
     }
}

results matching ""

    No results matching ""